﻿using System;
using System.Text.RegularExpressions;

namespace Process
{
    public class xString
    {
        /// <summary>
        /// Chuẩn háo tên.
        /// </summary>
        /// <param name="theName">TTên.</param>
        /// <returns>Tên đã được chuẩn hóa</returns>
        public static string Name(string theName)
        {
            if (!string.IsNullOrEmpty(theName))
            {
                theName = theName.Trim();
                while (theName.IndexOf("\t") >= 0)
                {
                    theName = theName.Replace("\t", " ");
                }
                while (theName.IndexOf("  ") >= 0)
                {
                    theName = theName.Replace("  ", " ");
                }
                string[] arrStr = theName.Split(' ');
                string s = "";
                foreach (string item in arrStr)
                {
                    s += item.Substring(0, 1).ToUpper() + item.Substring(1).ToLower() + " ";
                }
                return s.TrimEnd();
            }
            else
            {
                return "";
            }
        }

        /// <summary>
        /// Kiểm tra giá trị với chuỗi regular
        /// </summary>
        /// <param name="value">Giá trị.</param>
        /// <param name="pattern">Chuỗi regular.</param>
        /// <returns></returns>
        public static bool Check(string value, string pattern)
        {
            if (value != "")
            {
                return Regex.IsMatch(value, pattern);
            }
            else
            {
                return true;
            }
        }

        /// <summary>
        /// Kiểm tra số
        /// </summary>
        /// <param name="value">Giá trị.</param>
        /// <returns>
        ///   <c>true</c> Nếu giá trị là số (VD: -12.12); nếu không, <c>false</c>.
        /// </returns>
        public static bool IsNumber(string value)
        {
            string pattern = @"^-?\d*\.?\d*$"; //-12.12
            return Check(value, pattern);
        }

        /// <summary>
        /// Kiểm tra số
        /// </summary>
        /// <param name="value">Giá trị.</param>
        /// <param name="style">Kiểu số.</param>
        /// <returns>
        ///   <c>true</c> Nếu giá trị là số đúng kiểu; nếu không, <c>false</c>.
        /// </returns>
        public static bool IsNumber(string value, StyleNumber style)
        {
            string pattern = null;
            switch (style)
            {
                case StyleNumber.INTEGER:
                    pattern = @"^\d*$"; //12
                    return Check(value, pattern);
                case StyleNumber.INTEGER_NEGATIVE:
                    pattern = @"^-?\d*$"; //-12
                    return Check(value, pattern);
                case StyleNumber.REAL_ZERO:
                    pattern = @"^\d*\.?0*$"; //12.00
                    return Check(value, pattern);
                case StyleNumber.REAL_NEGATIVE_ZERO:
                    pattern = @"^-?\d*\.?0*$"; //-12.00
                    return Check(value, pattern);
                case StyleNumber.REAL:
                    pattern = @"^\d*\.?\d*$"; //12.12
                    return Check(value, pattern);
                case StyleNumber.REAL_NEGATIVE:
                default:
                    pattern = @"^-?\d*\.?\d*$"; //-12.12
                    return Check(value, pattern);
            }
        }

        #region Copy to internet
        private static string str = " ";
        private static string[] ChuSo = new string[10] { " không", " một", " hai", " ba", " bốn", " năm", " sáu", " bẩy", " tám", " chín" };
        private static string[] Tien = new string[6] { "", " nghìn", " triệu", " tỷ", " nghìn tỷ", " triệu tỷ" };

        // Hàm đọc số có 3 chữ số
        private static string DocSo3ChuSo(int baso)
        {
            int tram, chuc, donvi;
            string KetQua = "";
            tram = (int)(baso / 100);
            chuc = (int)((baso % 100) / 10);
            donvi = baso % 10;
            if ((tram == 0) && (chuc == 0) && (donvi == 0)) return "";
            if (tram != 0)
            {
                KetQua += ChuSo[tram] + " trăm";
                if ((chuc == 0) && (donvi != 0)) KetQua += " linh";
            }
            if ((chuc != 0) && (chuc != 1))
            {
                KetQua += ChuSo[chuc] + " mươi";
                if ((chuc == 0) && (donvi != 0)) KetQua = KetQua + " linh";
            }
            if (chuc == 1) KetQua += " mười";
            switch (donvi)
            {
                case 1:
                    if ((chuc != 0) && (chuc != 1))
                    {
                        KetQua += " mốt";
                    }
                    else
                    {
                        KetQua += ChuSo[donvi];
                    }
                    break;
                case 5:
                    if (chuc == 0)
                    {
                        KetQua += ChuSo[donvi];
                    }
                    else
                    {
                        KetQua += " lăm";
                    }
                    break;
                default:
                    if (donvi != 0)
                    {
                        KetQua += ChuSo[donvi];
                    }
                    break;
            }
            return KetQua;
        }

        /// <summary>
        /// Chuyển số tiến sang dạng chuỗi ký tự
        /// </summary>
        /// <param name="SoTien">Số tiền.</param>
        /// <returns>Số tiền dạng chữ</returns>
        public static string DocTienBangChu(long SoTien)
        {
            bool checkAm = false;
            int lan, i;
            long so;
            string KetQua = "", tmp = "";
            int[] ViTri = new int[6];
            if (SoTien < 0)
            {
                checkAm = true;
                SoTien = SoTien * (-1);
            }
            if (SoTien == 0) return "không";
            if (SoTien > 0)
            {
                so = SoTien;
            }
            else
            {
                so = -SoTien;
            }
            //Kiểm tra số quá lớn
            if (SoTien > 8999999999999999)
            {
                SoTien = 0;
                return "";
            }
            ViTri[5] = (int)(so / 1000000000000000);
            so = so - long.Parse(ViTri[5].ToString()) * 1000000000000000;
            ViTri[4] = (int)(so / 1000000000000);
            so = so - long.Parse(ViTri[4].ToString()) * +1000000000000;
            ViTri[3] = (int)(so / 1000000000);
            so = so - long.Parse(ViTri[3].ToString()) * 1000000000;
            ViTri[2] = (int)(so / 1000000);
            ViTri[1] = (int)((so % 1000000) / 1000);
            ViTri[0] = (int)(so % 1000);
            if (ViTri[5] > 0)
            {
                lan = 5;
            }
            else if (ViTri[4] > 0)
            {
                lan = 4;
            }
            else if (ViTri[3] > 0)
            {
                lan = 3;
            }
            else if (ViTri[2] > 0)
            {
                lan = 2;
            }
            else if (ViTri[1] > 0)
            {
                lan = 1;
            }
            else
            {
                lan = 0;
            }
            for (i = lan; i >= 0; i--)
            {
                tmp = DocSo3ChuSo(ViTri[i]);
                KetQua += tmp;
                if (ViTri[i] != 0) KetQua += Tien[i];
            }
            if (KetQua.Substring(KetQua.Length - 1, 1) == ",") KetQua = KetQua.Substring(0, KetQua.Length - 1);
            if (checkAm)
            {
                return "âm " + KetQua.Trim();
            }
            else
            {
                return KetQua.Trim();
            }
        }
        #endregion
    }
}
